package com.grandt.model.database.manager;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import com.grandt.model.beans.TorneoAmigo;
import com.grandt.model.beans.TorneoAmigoBean;
import com.grandt.model.beans.equipo.Equipo;
import com.grandt.model.configuration.ConfigurationBean;
import com.grandt.model.constants.TipoEquipoTorneoAmigo;
import com.grandt.model.exceptions.BuscarDatosException;
import com.grandt.model.exceptions.JugadoresCompletoException;
import com.grandt.model.exceptions.ModifyDataException;
import com.grandt.model.manager.ManagerEquipo;

public class DataBaseTorneoAmigo extends ManagerDataBase {

	//private DataBaseEquipo	dataBaseEquipo;
	private ManagerEquipo managerEquipo;
	public DataBaseTorneoAmigo(ConfigurationBean configuration,ManagerEquipo managerEquipo) {
		super(configuration);
		this.managerEquipo = managerEquipo;
		//dataBaseEquipo = new DataBaseEquipo(configuration);
	}


	@Override
	protected String getStrInsert() {
		String query="INSERT INTO TORNEO_AMIGO(NOMBRE,ID_EQUIPO,ESTADO)" +
				" VALUES (?,?,?)";
		return query;
	}
	
	@Override
	protected void insertParameters(PreparedStatement prst,Object o) throws SQLException {		
		
		TorneoAmigoBean torneo = (TorneoAmigoBean) o;
		prst.setString(1, torneo.getName());
		prst.setString(2, torneo.getEquipo());
		prst.setString(3, torneo.getEstado().toString());
	}

	public boolean existeUsuario(String dni) throws BuscarDatosException {
		
		try {
			
			String query = "Select * from USUARIO where NUMERO_DOCUMENTO=?";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			prst.setString(1, dni);
			ResultSet result = prst.executeQuery();			
			
			if(result.next()) {
				return true;
			}
			prst.close();
			return false;
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
	}
	@Override
	protected List<Object> getResult(ResultSet result) {
		return null;
	}
	@Override
	protected String getStrQuery() {
		String query="Select * from USUARIO where NUMERO_DOCUMENTO=?";
		return query;
	}

	@Override
	protected void queryParameters(PreparedStatement prst, Object o) {
		// TODO Auto-generated method stub
		
	}

	
	public List<TorneoAmigo> getTorneoAmigos() throws BuscarDatosException, JugadoresCompletoException {
		List<TorneoAmigo> torneos = new LinkedList<TorneoAmigo>();
		try {

			String query = "Select * from TORNEO_AMIGO ";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				getTorneoAmigos(torneos,result);				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return torneos;
	}


	private TorneoAmigo getTorneoAmigos(List<TorneoAmigo> torneos, ResultSet result) throws SQLException, BuscarDatosException, JugadoresCompletoException {
		TorneoAmigo torneo = new TorneoAmigo();
		TipoEquipoTorneoAmigo estado = TipoEquipoTorneoAmigo.postulante;		
		torneo.setNombre(result.getString("NOMBRE"));
		if(torneos.contains(torneo)){
			torneo = torneos.get(torneos.indexOf(torneo));
		}
		if(result.getString("ESTADO")!=null){
			estado = TipoEquipoTorneoAmigo.valueOf(result.getString("ESTADO").toLowerCase());
		}
		if(result.getString("ID_EQUIPO")!=null && !result.getString("ID_EQUIPO").equals("")){
			Equipo equipo = getEquipo(result.getString("ID_EQUIPO"));
			if(estado.equals(TipoEquipoTorneoAmigo.postulante)){
				torneo.addPostulante(equipo);
			}else{
				torneo.addIntegrante(equipo);
			}
		}
		if(!torneos.contains(torneo)){
			torneos.add(torneo);
		}
		return torneo;
	}

	private TorneoAmigo getTorneoAmigos(ResultSet result) throws SQLException, BuscarDatosException, JugadoresCompletoException {
		TorneoAmigo torneo = new TorneoAmigo();
		while(result.next()){
			TipoEquipoTorneoAmigo estado = TipoEquipoTorneoAmigo.postulante;		
			torneo.setNombre(result.getString("NOMBRE"));
			if(result.getString("ESTADO")!=null){
				estado = TipoEquipoTorneoAmigo.valueOf(result.getString("ESTADO").toLowerCase());
			}
			if(result.getString("ID_EQUIPO")!=null && !result.getString("ID_EQUIPO").equals("")){
				Equipo equipo = getEquipo(result.getString("ID_EQUIPO"));
				if(estado.equals(TipoEquipoTorneoAmigo.postulante)){
					torneo.addPostulante(equipo);
				}else{
					torneo.addIntegrante(equipo);
				}
			}
		}
		return torneo;
	}

	private Equipo getEquipo(String nombre) throws BuscarDatosException, JugadoresCompletoException {
		return managerEquipo.getEquipo(nombre);
	}


	public TorneoAmigo getTorneoAmigo(String nombre) throws BuscarDatosException, JugadoresCompletoException {
		TorneoAmigo torneo = null;
		try {

			String query = "Select * from TORNEO_AMIGO where nombre=?";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			prst.setString(1, nombre);
			ResultSet result = prst.executeQuery();
			torneo = getTorneoAmigos(result);				
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return torneo;
	}


	public void aceptarUsuarioEnTorneoAmigo(TorneoAmigo torneoAmigo,List<Equipo> postulantes) throws ModifyDataException {
		for (Equipo equipo : postulantes) {		
			try {
				String query = "UPDATE TORNEO_AMIGO SET " +
				" ESTADO = ? "+
				" WHERE NOMBRE=?" +
						" AND ID_EQUIPO=?";
					/*" ESTADO = '"+TipoEquipoTorneoAmigo.integrante+"'"+
					" WHERE NOMBRE='"+torneoAmigo.getNombre()+"'" +
							" AND ID_EQUIPO='"+equipo.getNombre()+"'";
							*/
				PreparedStatement prst;
				prst = connection.prepareStatement(query);
				prst.setString(1, TipoEquipoTorneoAmigo.integrante.toString());
				prst.setString(2, torneoAmigo.getNombre());
				prst.setString(3, equipo.getNombre());
				prst.execute();
				prst.getConnection().commit();
				prst.close();
			} catch (SQLException e) {
				throw new ModifyDataException(e);
			}
		}
		
	}


	public void setManagerEquipo(ManagerEquipo managerEquipo) {
		this.managerEquipo = managerEquipo;
	}

}
